#!/usr/bin/env node
import { Command } from "commander"
import inquirer from "inquirer"
import chalk from "chalk"
import YapiGenerator from "./generator"
import fs from "fs"
import path from "path"

// 动态读取 package.json 中的版本号
const packageJson = JSON.parse(
  fs.readFileSync(path.join(__dirname, "../package.json"), "utf-8")
)
const version = packageJson.version

const program = new Command()

program
  .version(version)
  .description("API 生成器 CLI - 支持 APIPost 和 Swagger")
  .option("-c, --config <path>", "配置文件路径")
  .action(async (options) => {
    const configPath = options.config || "./api-gen.config.json"
    let config = null
    
    // 首先让用户选择平台
    const platformChoice = await inquirer.prompt([
      {
        type: "list",
        name: "platform",
        message: "请选择API平台:",
        choices: [
          { name: "APIPost", value: "apipost" },
          { name: "Swagger/OpenAPI", value: "swagger" }
        ]
      }
    ])

    // 检查配置文件是否存在
    if (fs.existsSync(configPath)) {
      console.log(chalk.green(`使用该路径下的配置文件 ${configPath}`))
      config = JSON.parse(fs.readFileSync(configPath, "utf-8"))
    } else {
      // 如果配置文件不存在，交互式生成配置文件
      console.log(chalk.yellow(`没有找到该路径下的配置文件 ${configPath}.`))
      
      if (platformChoice.platform === "apipost") {
        config = await inquirer.prompt([
          {
            type: "input",
            name: "projectId",
            message: "输入项目ID:"
          },
          {
            type: "input",
            name: "token",
            message: "输入项目token:"
          }
        ])
      } else {
        // Swagger平台不需要token，只需要URL
        config = await inquirer.prompt([
          {
            type: "input",
            name: "baseUrl",
            message: "输入Swagger API文档URL:",
            default: "http://10.1.120.118:48080/admin-api/system/v3/api-docs"
          }
        ])
      }

      // 只保存用户输入的配置到文件
      const userConfig = platformChoice.platform === "apipost" 
        ? {
            platform: "apipost",
            projectId: config.projectId,
            token: config.token,
            baseUrl: "https://open.apipost.net/open/apis/list"
          }
        : {
            platform: "swagger",
            baseUrl: config.baseUrl
          }
      fs.writeFileSync(configPath, JSON.stringify(userConfig, null, 2), "utf-8")
      console.log(chalk.green(`文件已被创建 ${configPath}`))
    }

    // 根据选择的平台设置配置
    if (platformChoice.platform === "apipost") {
      config.platform = "apipost"
      config.baseUrl = config.baseUrl || "https://open.apipost.net/open/apis/list"
      
      // 参数验证
      if (!config.token) {
        console.error(chalk.red("缺少必要参数：token"))
        process.exit(1)
      }
    } else {
      config.platform = "swagger"
      config.baseUrl = config.baseUrl || "http://10.1.120.118:48080/admin-api/system/v3/api-docs"
    }

    // 内部固定配置
    const outputDir = path.resolve("api-gen")
    const targetLanguage = "javascript"

    // 创建输出目录
    if (!fs.existsSync(outputDir)) {
      fs.mkdirSync(outputDir, { recursive: true })
    }

    try {
      const generator = new YapiGenerator({
        baseUrl: config.baseUrl,
        token: config.token,
        apiTemplate: config.apiTemplate,
        platform: config.platform,
        ...(config.projectId && { projectId: config.projectId })
      })

      console.log(chalk.blue("开始生成API代码..."))
      const result = await generator.generateGroupedCode()

      if (
        !result ||
        !result.grouped ||
        Object.keys(result.grouped).length === 0
      ) {
        console.error(chalk.red("未生成任何API代码"))
        return
      }

      // 固定使用JavaScript
      const fileExtension = "js"
      const generatedFiles: string[] = []

      // 为每个分组和URL前缀创建目录和文件
      for (const [groupName, urlGroups] of Object.entries(result.grouped)) {
        // 直接使用分组名称作为目录路径，保持完整的URL层级结构
        const groupDir = groupName ? path.join(outputDir, groupName) : outputDir

        // 创建分组目录
        if (!fs.existsSync(groupDir)) {
          fs.mkdirSync(groupDir, { recursive: true })
        }

        // 为每个URL前缀生成文件
        for (const [urlPrefix, urlData] of Object.entries(urlGroups)) {
          if (!urlData.codes || !urlData.codes.trim()) continue

          // 生成API代码文件
          const apiFilePath = path.join(
            groupDir,
            `${urlPrefix}.${fileExtension}`
          )
          fs.writeFileSync(apiFilePath, urlData.codes)
          generatedFiles.push(apiFilePath)

          // 固定使用JavaScript，不需要生成类型文件
        }
      }

      console.log(chalk.green(`API代码生成成功！`))
      console.log(
        chalk.green(`生成的分组目录数量: ${Object.keys(result.grouped).length}`)
      )

      generatedFiles.forEach((file) => {
        console.log(chalk.green(`API文件: ${path.resolve(file)}`))
      })

      // 固定使用JavaScript，不需要显示类型文件

      console.log(
        chalk.green(`JSON文件目录: ${path.resolve(outputDir, "json")}/`)
      )
    } catch (error) {
      console.error(chalk.red("生成API代码时出错:"), error)
      process.exit(1)
    }
  })

program.parse(process.argv)
